console.log(undefined || 2);//左真则停止
console.log(false && 0);//左假则停止 都真输出右边的

const dd = {
    x: 42,
    getX: function () {
        return this.x;
    },
};

const unboundGetX = dd.getX;
console.log(unboundGetX());//undefined
console.log(dd.getX());//42 写法不同 得出结果不同

function objectFactory() {

    var obj = new Object(),

        Constructor = [].shift.call(arguments);//这一步是返回了arguments的第一项，且删除了第一项，因为argument是伪数组，所以才需要这样写

    obj.__proto__ = Constructor.prototype;

    var ret = Constructor.apply(obj, arguments);//是删除了第一项的结果



};

var arrayLike = {
    0: 'name',
    1: 'age',
    2: 'sex',
    length: 3
}
Array.prototype.map.call(arrayLike, function (item) {
    return item.toUpperCase();//变成大写
}); //可以用这个形式来遍历类数组

let values = new Array();
for (var i = 0, len = arguments.length; i < len; i++) {
    values.push(arguments[i]);
}//values是一个数组
values.push.apply(values, arguments);//和上面的效果是一样的 push对相应argument 

function person(name) {
    var o = new Object();
    o.sayName = function () {
        console.log(name);
    };
    return o;
}//寄生构造函数 相当于o是这里面的构造函数  没有公共属性的意思就是没有name:等等，只有方法

var person1 = person('kevin');
person1.sayName()
console.log(person1);
let person2 = new person('jie')
person2.sayName()
console.log(1 + '');

function Parent() {
    this.names = ['kevin', 'daisy'];
}

function Child() {

}

Child.prototype = new Parent();

var child1 = new Child();

child1.names.push('yayu');
console.log(Child.prototype, '---');//Parent { names: [ 'kevin', 'daisy', 'yayu' ] }使得原型也改变
console.log(child1.names); // ["kevin", "daisy", "yayu"]
console.log(Parent);
let a = new Parent()
console.log(a.names);//['kevin', 'daisy']

